// https://leetcode.cn/problems/single-number-iii
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        // 哈希统计次数(不符合题目要求)
        // unordered_map<int,int> hash;
        // for(const auto& x : nums) hash[x]++;
        // vector<int> ret;
        // for(const auto& [k,v] : hash) {
        //     if(v == 1) ret.push_back(k);
        // }
        // return ret;

        // 位运算,异或运算律的应用
        unsigned int t = 0;
        for(const auto& x : nums) t ^= x; // 此处有可能溢出
        int judge = (t &= -t); // 提取出最后一位1,依据该位置是否是1来判断,将数据分为两组
        int v1 = 0, v2 = 0;
        for(const auto& x : nums) {
            if(x & judge) v1 ^= x;
            else v2 ^= x;
        }
        return {v1,v2};
    }
};
